package com.hmily.dubbo.consumer.async;

import com.hmily.dubbo.api.async.AsyncUserQueryFacade;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;

/**
 * <h1>通过 setCallback 调用等待结果.</h1>
 *
 * @author hmilyylimh
 *         ^_^
 * @version 0.0.1
 *         ^_^
 * @date 2021-10-20
 *
 */
public class AsyncSetCallbackResultApplication {

    public static void main(String[] args) throws Exception {
        // 设置应用服务名称
        ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-consumer");
        // 设置注册中心的地址
        RegistryConfig registryConfig = new RegistryConfig("zookeeper://127.0.0.1:2181");

        // 创建引用 AsyncUserQueryFacade 这个服务的对象
        ReferenceConfig<AsyncUserQueryFacade> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(applicationConfig);
        referenceConfig.setRegistry(registryConfig);
        referenceConfig.setInterface(AsyncUserQueryFacade.class);
        referenceConfig.setTimeout(12000);
        // 真正开启异步化操作，让调用方可以通过 Future 来拿到最终的结果
        referenceConfig.setAsync(true);

        // 直接拿到引用的代理对象，然后进行远程调用
        AsyncUserQueryFacade asyncUserQueryFacade = referenceConfig.get();
        // 既然是异步化操作获取结果，那么下面这行代码会有结果么？？？
        System.out.println("注定拿不到结果: " + asyncUserQueryFacade.queryUserById("G314"));

        // 拿到一个 Future 对象，这个 Future 对象哪里来呢？其实是从 RpcContext 远程调用上下文中获取得到的
        /**
         * <pre>
         *         <dependency>
         *             <groupId>org.apache.dubbo</groupId>
         *             <artifactId>dubbo</artifactId>
         *             <version>2.7.1</version>
         *         </dependency>
         * </pre>
         *
         * 这个 setCallback 接口，大家需要验证的话，可以将 dubbo 的版本切换为 2.7.1 即可验证
         */
//        ((FutureAdapter)RpcContext.getContext().getFuture()).getFuture().setCallback(new ResponseCallback() {
//            // 成功的回调
//            @Override
//            public void done(Object response) {
//                System.out.println("注定可以拿到结果: " + response);
//            }
//            // 异常的回调
//            @Override
//            public void caught(Throwable exception) {
//                System.out.println("非常意外走到了异常分支: " + exception.getLocalizedMessage());
//            }
//        });

        // 阻塞等待
        System.in.read();
    }
}
